
// ES6
// class Dog{
//     species = "Dog";  // 值是定死的 (class中声明的变量 也会存储到实例化对象上)
//     constructor(name,age){ // 可以接收参数
//         // {}
//         this.name= name;
//         this.age= age;
//     }
//     call(){
//         console.log("旺旺");
//     }
//     intro(){
//         console.log(this.name,this.age);
//     }
// }

// new Dog('Tom',2);  // {name,age,species}

// class Tianyuan extends Dog{
//     skill(){
//         console.log("看门");
//     }
// }





// ES6 + TS类型修饰
// class Dog{
//     name:string;    // 只是添加了实例属性的类型限制 => 没有赋值
//     age:number|string;

//     // 任意属性
//     // [propName:string]:number|string|(()=>void);
    
//     species:string = "Dog";  // 赋值了 (class中直接创建的变量 -> 存储)
//     constructor(name:string,age:number|string){
//         this.name= name;
//         this.age= age;
//     }
//     call(){
//         console.log("旺旺");
//     }
//     intro(){
//         console.log(this.name,this.age);
//     }
// }


// class Tianyuan extends Dog{
//     skill(){
//         console.log("看门");
//     }
// }


// TS和类相关的修饰符
// TypeScript 可以使用三种访问修饰符（Access Modifiers），分别是 public、private 和 protected。

// public 修饰的属性或方法是公有的，可以在任何地方被访问到，默认所有的属性和方法都是 public 的
// private 修饰的属性或方法是私有的，不能在声明它的类的外部访问 (在子类中也是不允许访问的)
// protected 修饰的属性或方法是受保护的，它和 private 类似，区别是它在子类中也是允许被访问的


class Dog{
    public readonly name:string;    // 只是添加了实例属性的类型限制 => 没有赋值

    // private age:number|string;  // 私有属性 (在子类中也是不允许访问的)
    protected age:number|string;  // 受保护的 (子类中也是允许被访问的)

    // 任意属性
    // [propName:string]:number|string|(()=>void);
    
    species:string = "Dog";  // 赋值了 (class中直接创建的变量 -> 存储)
    constructor(name:string,age:number|string){
        this.name= name;
        this.age= age;
    }
    call(){
        console.log("旺旺");
    }
    intro(){  //调用此方法 => 在类的内部访问 => ok
        console.log(this.name,this.age);
    }
}

// let WangCai = new Dog("WangCai",3);
// console.log(WangCai.name);
// // console.log(WangCai.age);  // 在类的外部访问
// WangCai.intro();



class Tianyuan extends Dog{
    constructor(name:string,age:number){
        super(name,age);
        console.log(this.name);
    }
    skill(){
        console.log("看门啊,"+ this.name);
    }
}

let WangCai = new Tianyuan("WangCai",3);
WangCai.skill();

export default {}